//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/.
// 

package netsim.simulations.networks;

import inet.common.scenario.ScenarioManager;
import inet.networks.base.TsnNetworkBase;
import inet.node.ethernet.EthernetLink;
import inet.node.tsn.TsnDevice;
import inet.node.tsn.TsnSwitch;

// 自定义交换机模块（可扩展 TsnSwitch 的统计、行为等）
module LocalTsnSwitch extends TsnSwitch
{
    @defaultStatistic("gateStateChanged:vector"; module="eth[0].macLayer.queue.gate[0]");
}

// 定义匹配图片拓扑的网络
network ManualConfiguration extends TsnNetworkBase
{
    submodules:
        // 场景管理器：控制链路断开等仿真事件
        scenarioManager: ScenarioManager {
            @display("p=100,800;is=s");
        }
        // 源设备：ES1、ES2
        es1: TsnDevice {
            @display("p=300,200");
            numEthInterfaces = 1;
        }
        es2: TsnDevice {
            @display("p=300,300");
            numEthInterfaces = 1;
        }
        // 交换机：SW1、SW2、SW3、SW4
        sw1: LocalTsnSwitch {
            @display("p=500,200");
            numEthInterfaces = 5;
        }
        sw2: LocalTsnSwitch {
            @display("p=700,100");
            numEthInterfaces = 3;
        }
        sw3: LocalTsnSwitch {
            @display("p=700,300");
            numEthInterfaces = 3;
        }
        sw4: LocalTsnSwitch {
            @display("p=900,200");
            numEthInterfaces = 5;
        }
        // 目的设备：ES3、ES4
        es3: TsnDevice {
            @display("p=1100,100");
            numEthInterfaces = 1;
        }
        es4: TsnDevice {
            @display("p=1100,300");
            numEthInterfaces = 1;
        }
    connections:
        // ES1 → SW1：为 s1、s3 提供源链路
        es1.ethg[0] <--> EthernetLink <--> sw1.ethg[0];
        // ES2 → SW1：为 s2、s4 提供源链路
        es2.ethg[0] <--> EthernetLink <--> sw1.ethg[1];
        // SW1 → SW2：支撑 s1 路径①（ES1→SW1→SW2→SW4→ES3）
        sw1.ethg[2] <--> EthernetLink <--> sw2.ethg[0];
        // SW1 → SW3：支撑 s2 路径①（ES2→SW1→SW3→SW4→ES3）、s3 路径①（ES1→SW1→SW3→SW4→ES4）、s4 路径①（ES2→SW1→SW3→SW4→ES4）
        sw1.ethg[4] <--> EthernetLink <--> sw3.ethg[0];
        // SW1 → SW4：支撑各流路径②（直接到 SW4）
        sw1.ethg[3] <--> EthernetLink <--> sw4.ethg[0];
        // SW2 → SW4：支撑 s1 路径①（SW2→SW4→ES3）
        sw2.ethg[1] <--> EthernetLink <--> sw4.ethg[1];
        // SW3 → SW4：支撑 s2、s3、s4 路径①（SW3→SW4→目的）
        sw3.ethg[1] <--> EthernetLink <--> sw4.ethg[2];
        // SW4 → ES3：接收 s1、s2 流量
        sw4.ethg[3] <--> EthernetLink <--> es3.ethg[0];
        // SW4 → ES4：接收 s3、s4 流量
        sw4.ethg[4] <--> EthernetLink <--> es4.ethg[0];
        sw2.ethg[2] <--> EthernetLink <--> sw3.ethg[2];
}
